/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

import control.ControladorMatriz;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import model.Alternativa;
import model.Criterio;
import model.Matriz;
import util.Calculos;

/**
 *
 * @author jorge
 */
public class MatrizInicialPanel extends javax.swing.JPanel {

    /**
     * Creates new form matrizInicialPanel
     */
    ArrayList<Alternativa> alternativas;
    ArrayList<Alternativa> dominantes;
    ArrayList<Criterio> criterios;
    private ButtonGroup grupoBotonesMinimizar;
    private ButtonGroup grupoBotonesNormalizar;
    private ControladorMatriz controladorMatriz;
    JFrame parent;
    String[][] matrizRespaldo;
    public static final int SIN_USO_DOMINANTES = 2;
    JPanel content;
    private Component[][] componentes;
    private JPanel[] componentesCriterios;

    public MatrizInicialPanel(JFrame parent) {

        this.parent = parent;

        initComponents();

        alternativas = new ArrayList<Alternativa>();
        dominantes = new ArrayList<Alternativa>();
        criterios = new ArrayList<Criterio>();

        grupoBotonesMinimizar = new ButtonGroup();
        grupoBotonesMinimizar.add(radioBotonMaximizarInversa);
        grupoBotonesMinimizar.add(radioBotonRestarPonderaciones);

        grupoBotonesNormalizar = new ButtonGroup();
        grupoBotonesNormalizar.add(radioBotonPorcentajeMaximo);
        grupoBotonesNormalizar.add(radioBotonPorcentajeRango);
        grupoBotonesNormalizar.add(radioBotonPorcentajeTotal);
        grupoBotonesNormalizar.add(radioBotonIesimaComponente);

        controladorMatriz = new ControladorMatriz();

    }

    public void cargarTablaInicial(ArrayList<Alternativa> alternativas, ArrayList<Criterio> criterios) {

        this.alternativas = alternativas;
        this.criterios = criterios;

        content = new JPanel(new GridLayout(criterios.size() + 1, alternativas.size() + 1));
        componentes = new Component[criterios.size()][alternativas.size()];
        componentesCriterios = new JPanel[criterios.size()];

        content.add(PintarMatriz.obtenerLabelComodin("Criterios"));

        for (Alternativa item : alternativas) {
            content.add(PintarMatriz.obtenerLabelAlternativa(item));
        }

        int contadorCriterios = 0;
        for (Criterio item : criterios) {
            JPanel tituloCriterio = PintarMatriz.obtenerPanelCriterio(item);
            componentesCriterios[contadorCriterios] = tituloCriterio;
            content.add(tituloCriterio);

            for (int i = 0; i < alternativas.size(); i++) {

                if (item.getCuantitativoCualitativo().equals(Criterio.CUANTITATIVO)) {
                    JTextField textField = PintarMatriz.obtenerJTextField("");
                    componentes[contadorCriterios][i] = textField;
                    content.add(textField);
                } else {
                    JComboBox comboBox = PintarMatriz.obtenerJComboBox(item);
                    componentes[contadorCriterios][i] = comboBox;
                    content.add(comboBox);
                }
            }
            contadorCriterios++;
        }
        matrizPanel.getViewport().setView(content);
        matrizPanel.repaint();

    }

    public void cargarTablaLabels(String[][] matrizTemp) {

        content = new JPanel(new GridLayout(criterios.size() + 1, alternativas.size() + 1));
        componentes = new Component[criterios.size()][alternativas.size()];
        componentesCriterios = new JPanel[criterios.size()];

        content.add(PintarMatriz.obtenerLabelComodin("Criterios"));

        for (Alternativa item : alternativas) {
            content.add(PintarMatriz.obtenerLabelAlternativa(item));
        }

        int contadorCriterios = 0;
        for (Criterio item : criterios) {
            JPanel tituloCriterio = PintarMatriz.obtenerPanelCriterio(item);
            componentesCriterios[contadorCriterios] = tituloCriterio;
            content.add(tituloCriterio);

            for (int i = 0; i < alternativas.size(); i++) {
                JLabel label = PintarMatriz.obtenerdoubleJLabel(Double.parseDouble(matrizTemp[i][contadorCriterios]));
                componentes[contadorCriterios][i] = label;
                content.add(label);
            }
            contadorCriterios++;
        }
        matrizPanel.getViewport().setView(content);
        matrizPanel.repaint();

    }

    public void cargarTablaGuardada(String[][] matrizTemp) {

        content = new JPanel(new GridLayout(criterios.size() + 1, alternativas.size() + 1));
        componentes = new Component[criterios.size()][alternativas.size()];
        componentesCriterios = new JPanel[criterios.size()];

        content.add(PintarMatriz.obtenerLabelComodin("Criterios"));

        for (Alternativa item : alternativas) {
            content.add(PintarMatriz.obtenerLabelAlternativa(item));
        }

        int contadorCriterios = 0;
        for (Criterio item : criterios) {
            JPanel tituloCriterio = PintarMatriz.obtenerPanelCriterio(item);
            componentesCriterios[contadorCriterios] = tituloCriterio;
            content.add(tituloCriterio);

            for (int i = 0; i < alternativas.size(); i++) {

                boolean validado = validarPosicionMatriz(i, contadorCriterios, matrizTemp);

                if (item.getCuantitativoCualitativo().equals(Criterio.CUANTITATIVO)) {

                    JTextField textField;
                    if (validado) {
                        textField = PintarMatriz.obtenerJTextField(matrizTemp[i][contadorCriterios]);

                    } else {
                        textField = PintarMatriz.obtenerJTextField("");
                    }
                    componentes[contadorCriterios][i] = textField;
                    content.add(textField);
                } else {
                    JComboBox comboBox = PintarMatriz.obtenerJComboBox(item);
                    if (validado) {
                        for (int k = 0; k < comboBox.getItemCount(); k++) {
                            String cadenaTemporal = (String) comboBox.getItemAt(k);
                            String[] divisionCadena = cadenaTemporal.split("-");
                            if (matrizTemp[i][contadorCriterios].equals(divisionCadena[0])) {
                                comboBox.setSelectedIndex(k);
                            }
                        }
                    }
                    componentes[contadorCriterios][i] = comboBox;
                    content.add(comboBox);
                }
            }
            contadorCriterios++;
        }
        matrizPanel.getViewport().setView(content);
        matrizPanel.repaint();

    }

    public void recargarIdentificadoresColumnas(ArrayList<Criterio> criterios) {

        int contador = 0;
        for (Criterio item : criterios) {
            componentesCriterios[contador].remove(1);
            componentesCriterios[contador].add(PintarMatriz.obtenerPonderacionJLabel(item.getPonderacion()), 1);
            contador++;
        }

        matrizPanel.getViewport().setView(content);
        matrizPanel.repaint();

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        matrizPanel = new javax.swing.JScrollPane();
        optimosDeParetoBoton = new javax.swing.JButton();
        tecnicaComboBox = new javax.swing.JComboBox();
        minimizarPanel = new javax.swing.JPanel();
        radioBotonMaximizarInversa = new javax.swing.JRadioButton();
        radioBotonRestarPonderaciones = new javax.swing.JRadioButton();
        normalizacionPanel = new javax.swing.JPanel();
        radioBotonPorcentajeMaximo = new javax.swing.JRadioButton();
        radioBotonPorcentajeRango = new javax.swing.JRadioButton();
        radioBotonPorcentajeTotal = new javax.swing.JRadioButton();
        radioBotonIesimaComponente = new javax.swing.JRadioButton();
        sinSolucionesNoFactibesRadioBoton = new javax.swing.JRadioButton();
        obtenerResultadoBoton = new javax.swing.JButton();
        obtenerTodosResultadosBoton = new javax.swing.JButton();

        matrizPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));

        optimosDeParetoBoton.setText("Óptimos de Pareto");
        optimosDeParetoBoton.setEnabled(false);
        optimosDeParetoBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                optimosDeParetoBotonActionPerformed(evt);
            }
        });

        tecnicaComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Seleccione técnica...", "Tasacion simple", "Tasacion directa", "Matriz de dominación", "Método de la entropia" }));
        tecnicaComboBox.setEnabled(false);
        tecnicaComboBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tecnicaComboBoxActionPerformed(evt);
            }
        });

        minimizarPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Técnicas para Minimizar"));

        radioBotonMaximizarInversa.setText("Maximizar la inversa");
        radioBotonMaximizarInversa.setEnabled(false);
        radioBotonMaximizarInversa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioBotonMaximizarInversaActionPerformed(evt);
            }
        });

        radioBotonRestarPonderaciones.setText("Restar ponderaciones asoc.");
        radioBotonRestarPonderaciones.setEnabled(false);
        radioBotonRestarPonderaciones.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioBotonRestarPonderacionesActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout minimizarPanelLayout = new javax.swing.GroupLayout(minimizarPanel);
        minimizarPanel.setLayout(minimizarPanelLayout);
        minimizarPanelLayout.setHorizontalGroup(
            minimizarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(minimizarPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(minimizarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(radioBotonMaximizarInversa)
                    .addComponent(radioBotonRestarPonderaciones))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        minimizarPanelLayout.setVerticalGroup(
            minimizarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(minimizarPanelLayout.createSequentialGroup()
                .addComponent(radioBotonMaximizarInversa)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(radioBotonRestarPonderaciones))
        );

        normalizacionPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Métodos de Normalización"));

        radioBotonPorcentajeMaximo.setText("% del máximo");
        radioBotonPorcentajeMaximo.setEnabled(false);
        radioBotonPorcentajeMaximo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioBotonPorcentajeMaximoActionPerformed(evt);
            }
        });

        radioBotonPorcentajeRango.setText("% del rango");
        radioBotonPorcentajeRango.setEnabled(false);
        radioBotonPorcentajeRango.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioBotonPorcentajeRangoActionPerformed(evt);
            }
        });

        radioBotonPorcentajeTotal.setText("% del total");
        radioBotonPorcentajeTotal.setEnabled(false);
        radioBotonPorcentajeTotal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioBotonPorcentajeTotalActionPerformed(evt);
            }
        });

        radioBotonIesimaComponente.setText("Iésima componente del vector");
        radioBotonIesimaComponente.setEnabled(false);
        radioBotonIesimaComponente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioBotonIesimaComponenteActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout normalizacionPanelLayout = new javax.swing.GroupLayout(normalizacionPanel);
        normalizacionPanel.setLayout(normalizacionPanelLayout);
        normalizacionPanelLayout.setHorizontalGroup(
            normalizacionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(normalizacionPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(normalizacionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(radioBotonPorcentajeMaximo)
                    .addComponent(radioBotonPorcentajeRango)
                    .addComponent(radioBotonPorcentajeTotal)
                    .addComponent(radioBotonIesimaComponente))
                .addContainerGap(26, Short.MAX_VALUE))
        );
        normalizacionPanelLayout.setVerticalGroup(
            normalizacionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(normalizacionPanelLayout.createSequentialGroup()
                .addComponent(radioBotonPorcentajeMaximo)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(radioBotonPorcentajeRango)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(radioBotonPorcentajeTotal)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(radioBotonIesimaComponente))
        );

        sinSolucionesNoFactibesRadioBoton.setText("Sin soluciones no factibles");
        sinSolucionesNoFactibesRadioBoton.setEnabled(false);
        sinSolucionesNoFactibesRadioBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sinSolucionesNoFactibesRadioBotonActionPerformed(evt);
            }
        });

        obtenerResultadoBoton.setText("Obtener Resultado");
        obtenerResultadoBoton.setEnabled(false);
        obtenerResultadoBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                obtenerResultadoBotonActionPerformed(evt);
            }
        });

        obtenerTodosResultadosBoton.setText("Obtener Todos Resultados");
        obtenerTodosResultadosBoton.setEnabled(false);
        obtenerTodosResultadosBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                obtenerTodosResultadosBotonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(matrizPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 689, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(40, 40, 40)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(normalizacionPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(minimizarPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(tecnicaComboBox, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(sinSolucionesNoFactibesRadioBoton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(obtenerResultadoBoton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(optimosDeParetoBoton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(obtenerTodosResultadosBoton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(matrizPanel, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(optimosDeParetoBoton)
                        .addGap(5, 5, 5)
                        .addComponent(sinSolucionesNoFactibesRadioBoton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(tecnicaComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(minimizarPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(normalizacionPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(obtenerResultadoBoton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(obtenerTodosResultadosBoton)))
                .addContainerGap(155, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void radioBotonRestarPonderacionesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioBotonRestarPonderacionesActionPerformed
        Calculos.setMetodoParaCriteriosMiniziados(Calculos.RESTAR_PONDERACIONES);
        habilitarPanelMetodosNormalizacion(true);
        habilitarTecnica(false);
    }//GEN-LAST:event_radioBotonRestarPonderacionesActionPerformed

    private void optimosDeParetoBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_optimosDeParetoBotonActionPerformed
        Calculos.setAlternativas(alternativas);
        dominantes = (ArrayList<Alternativa>) alternativas.clone();
        Calculos.setDominantes(dominantes);
        Calculos.setCriterios(criterios);
        Matriz matrizTemporal = new Matriz();
        matrizTemporal.setMatriz(getMatriz());
        Calculos.setMatriz(matrizTemporal);
        Calculos.optimosDePareto();
        String si = "Si";
        String no = "No";
        String respuesta;
        Object[] options = {no, si};

        if (dominantes != null && !dominantes.isEmpty()) {
            respuesta = "Alternativas Dominantes: ";
            for (Alternativa item : dominantes) {
                respuesta += item.getNombre() + " ";
            }
        } else {
            respuesta = "No se han encontrado alternativas dominantes";
        }

        respuesta += "\nDesea ver el informe?";

        int opcion = JOptionPane.showOptionDialog(this, respuesta, "¡Respuesta Optimos de Pareto!", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, si);

        if (opcion == 1) { //Se ha seleccionado ver el informe
            AbrirInforme(Calculos.NOMBRE_INFORME_OPTIMOS);
        }

        habilitarUsoOptimosSeleccion(true);
        habilitarTecnica(true);
    }//GEN-LAST:event_optimosDeParetoBotonActionPerformed

    private void tecnicaComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tecnicaComboBoxActionPerformed

        int itemSeleccionado = tecnicaComboBox.getSelectedIndex();

        String[] resultadoPonderacion = new Dialogo(parent, criterios, itemSeleccionado).getPesos();

        if (resultadoPonderacion != null) {
            if (resultadoPonderacion.length > 0) {
                for (int i = 0; i < criterios.size(); i++) {
                    criterios.get(i).setPonderacion(Double.parseDouble(resultadoPonderacion[i]));
                }
                recargarIdentificadoresColumnas(criterios);

                habilitarPanelCriterioMinimizar(true);
                habilitarUsoOptimosSeleccion(false);
                habilitarTecnica(false);
                habilitarOptimosPareto(false);
                MainPanel mainPanel = (MainPanel) parent;
                mainPanel.habilitarBotonPress(true);
            }
        }else{
            JOptionPane.showMessageDialog(null, "Toda vía no ha seleccionado método de ponderación", "¡Resultado Final!", JOptionPane.ERROR_MESSAGE);
        }


    }//GEN-LAST:event_tecnicaComboBoxActionPerformed

    private void radioBotonMaximizarInversaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioBotonMaximizarInversaActionPerformed
//cargarTabl

        Calculos.setMetodoParaCriteriosMiniziados(Calculos.MAXIMIZAR_INVERSA);
        ModificarMaximizarInversa();
        habilitarTecnica(false);
        MainPanel mainPanel = (MainPanel) parent;
        mainPanel.habilitarBotonPress(false);
    }//GEN-LAST:event_radioBotonMaximizarInversaActionPerformed

    private void radioBotonPorcentajeMaximoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioBotonPorcentajeMaximoActionPerformed
//        respaldarMatriz();
//        recargarMatriz(Calculos.ponderarResultados(Calculos.NORMALIZAR_MAXIMO));
        cargarTablaLabels(Calculos.ponderarResultados(Calculos.NORMALIZAR_MAXIMO));
        habilitarBotonObtenerResultado(true);
        habilitarPanelCriterioMinimizar(false);
    }//GEN-LAST:event_radioBotonPorcentajeMaximoActionPerformed

    private void radioBotonPorcentajeRangoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioBotonPorcentajeRangoActionPerformed
//        respaldarMatriz();
//        recargarMatriz(Calculos.ponderarResultados(Calculos.NORMALIZAR_RANGO));
        cargarTablaLabels(Calculos.ponderarResultados(Calculos.NORMALIZAR_RANGO));
        habilitarBotonObtenerResultado(true);
    }//GEN-LAST:event_radioBotonPorcentajeRangoActionPerformed

    private void radioBotonPorcentajeTotalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioBotonPorcentajeTotalActionPerformed
//        respaldarMatriz();
//        recargarMatriz(Calculos.ponderarResultados(Calculos.NORMALIZAR_SUMA));
        cargarTablaLabels(Calculos.ponderarResultados(Calculos.NORMALIZAR_SUMA));
        habilitarBotonObtenerResultado(true);
    }//GEN-LAST:event_radioBotonPorcentajeTotalActionPerformed

    private void radioBotonIesimaComponenteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioBotonIesimaComponenteActionPerformed
//        respaldarMatriz();
//        recargarMatriz(Calculos.ponderarResultados(Calculos.NORMALIZAR_IESIMO));
        cargarTablaLabels(Calculos.ponderarResultados(Calculos.NORMALIZAR_IESIMO));
        habilitarBotonObtenerResultado(true);
    }//GEN-LAST:event_radioBotonIesimaComponenteActionPerformed

    private void sinSolucionesNoFactibesRadioBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sinSolucionesNoFactibesRadioBotonActionPerformed
        dominantes = Calculos.getDominantes();
        habilitarOptimosPareto(false);
        sinSolucionesNoFactibesRadioBoton.setEnabled(false);
        eliminarNoDominantes();
    }//GEN-LAST:event_sinSolucionesNoFactibesRadioBotonActionPerformed

    private void obtenerResultadoBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_obtenerResultadoBotonActionPerformed

        String mensaje = resumenResultadosFinales();

        JOptionPane.showMessageDialog(null, mensaje, "¡Resultado Final!", JOptionPane.INFORMATION_MESSAGE);
    }//GEN-LAST:event_obtenerResultadoBotonActionPerformed

    private void obtenerTodosResultadosBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_obtenerTodosResultadosBotonActionPerformed

        String resultado = "";

        Calculos.ponderarResultados(Calculos.NORMALIZAR_MAXIMO);
        resultado += "Método de Normalización % del máximo\n";
        resultado += resumenResultadosFinales();
        resultado += "\n\n";
        Calculos.ponderarResultados(Calculos.NORMALIZAR_RANGO);
        resultado += "Método de Normalización % del rango\n";
        resultado += resumenResultadosFinales();
        resultado += "\n\n";
        Calculos.ponderarResultados(Calculos.NORMALIZAR_SUMA);
        resultado += "Método de Normalización % del total\n";
        resultado += resumenResultadosFinales();
        resultado += "\n\n";
        Calculos.ponderarResultados(Calculos.NORMALIZAR_IESIMO);
        resultado += "Método de Normalización iésima componente del vector\n";
        resultado += resumenResultadosFinales();
        resultado += "\n\n";

        JOptionPane.showMessageDialog(null, resultado, "¡Resultado Final!", JOptionPane.INFORMATION_MESSAGE);

    }//GEN-LAST:event_obtenerTodosResultadosBotonActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane matrizPanel;
    private javax.swing.JPanel minimizarPanel;
    private javax.swing.JPanel normalizacionPanel;
    private javax.swing.JButton obtenerResultadoBoton;
    private javax.swing.JButton obtenerTodosResultadosBoton;
    private javax.swing.JButton optimosDeParetoBoton;
    private javax.swing.JRadioButton radioBotonIesimaComponente;
    private javax.swing.JRadioButton radioBotonMaximizarInversa;
    private javax.swing.JRadioButton radioBotonPorcentajeMaximo;
    private javax.swing.JRadioButton radioBotonPorcentajeRango;
    private javax.swing.JRadioButton radioBotonPorcentajeTotal;
    private javax.swing.JRadioButton radioBotonRestarPonderaciones;
    private javax.swing.JRadioButton sinSolucionesNoFactibesRadioBoton;
    private javax.swing.JComboBox tecnicaComboBox;
    // End of variables declaration//GEN-END:variables

    public String[][] getMatriz() {

        String[][] matrizFinal = new String[componentes[0].length][componentes.length];

        for (int i = 0; i < componentes[0].length; i++) {
            for (int j = 0; j < componentes.length; j++) {

                if (componentes[j][i].getName().equals("text")) {

                    JTextField textField = (JTextField) componentes[j][i];
                    matrizFinal[i][j] = textField.getText();

                } else if (componentes[j][i].getName().equals("combo")) {

                    JComboBox comboBox = (JComboBox) componentes[j][i];
                    String valorSeleccionado = (String) comboBox.getSelectedItem();
                    matrizFinal[i][j] = valorSeleccionado.split("-")[0];

                } else if (componentes[j][i].getName().equals("label")) {

                    JLabel label = (JLabel) componentes[j][i];
                    matrizFinal[i][j] = label.getText();
                }
            }
        }

        return matrizFinal;
    }

    public void setMatriz(String[][] matrizFinal) {

        cargarTablaInicial(alternativas, criterios);
        cargarTablaGuardada(matrizFinal);

//
//        for (int i = 0; i < componentes[0].length; i++) {
//            for (int j = 0; j < componentes.length; j++) {
//
//                if (componentes[j][i].getName().equals("text")) {
//
//                    JTextField textField = (JTextField) componentes[j][i];
//                    textField.setText(matrizFinal[i][j]);
//
//                } else if (componentes[j][i].getName().equals("combo")) {
//
//                    JComboBox comboBox = (JComboBox) componentes[j][i];
//                    String valorSeleccionado = (String) comboBox.getSelectedItem();
//                    matrizFinal[i][j] = valorSeleccionado.split("-")[0];
//                }
//            }
//        }
//        
//        
//
//        DefaultTableModel temp = (DefaultTableModel) matriz.getModel();
//
//        for (int i = 0; i < alternativas.size(); i++) {
//            for (int j = 0; j < criterios.size(); j++) {
//
//                double valor = Double.parseDouble(matrizFinal[i][j]);
//
//                temp.setValueAt(Calculos.df.format(valor), i, j + 1);
//
//            }
//        }
    }

    public void habilitarOptimosPareto(boolean estado) {
        optimosDeParetoBoton.setEnabled(estado);
    }

    public void habilitarUsoOptimosSeleccion(boolean estado) {
        sinSolucionesNoFactibesRadioBoton.setEnabled(estado);
    }

    public void habilitarTecnica(boolean estado) {
        tecnicaComboBox.setEnabled(estado);
    }

    public void habilitarPanelCriterioMinimizar(boolean estado) {
        radioBotonMaximizarInversa.setEnabled(estado);
        radioBotonRestarPonderaciones.setEnabled(estado);
    }

    public void habilitarPanelMetodosNormalizacion(boolean estado) {
        radioBotonPorcentajeMaximo.setEnabled(estado);
        radioBotonPorcentajeRango.setEnabled(estado);
        radioBotonPorcentajeTotal.setEnabled(estado);
        radioBotonIesimaComponente.setEnabled(estado);
    }

    public void habilitarBotonObtenerResultado(boolean estado) {
        obtenerResultadoBoton.setEnabled(estado);
        obtenerTodosResultadosBoton.setEnabled(estado);
    }

    private void AbrirInforme(String directorio) {
        directorio = Calculos.RUTA_INFORMES + directorio;
        File archivo = new File(directorio);
        try {
            Desktop.getDesktop().open(archivo);
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    private void respaldarMatriz() {
        if (matrizRespaldo != null) {
            matrizRespaldo = getMatriz();
        }
    }

//    public void recargarMatriz(String[][] matrizNueva) {
//        
//        DefaultTableModel temp = (DefaultTableModel) matriz.getModel();
//
//        for (int i = 0; i < alternativas.size(); i++) {
//            for (int j = 0; j < criterios.size(); j++) {
//                double valor = Double.parseDouble(matrizNueva[i][j]);
//                temp.setValueAt(Calculos.df.format(valor), i, j + 1);
//            }
//        }
//    }
    public void eliminarNoDominantes() {


        for (int i = 0; i < alternativas.size(); i++) {

            int index = dominantes.indexOf(alternativas.get(i));

            if (index < 0) {
                alternativas.remove(i);
                i = -1;
            }
        }
        Matriz matrizTemporal = new Matriz();
        matrizTemporal.setMatriz(getMatriz());
        Calculos.setMatriz(matrizTemporal);
        Calculos.setAlternativas(alternativas);

        cargarTablaLabels(getMatriz());

        if (alternativas.size() <= 1) {
            habilitarTecnica(false);
        }
    }

    private void ModificarMaximizarInversa() {
        for (int i = 0; i < componentes.length; i++) {

            if (criterios.get(i).getOptimizacion().equals(Criterio.MINIMIZAR)) {
                for (int j = 0; j < componentes[j].length; j++) {

                    if (componentes[i][j].getName().equals("text")) {

                        JTextField textField = (JTextField) componentes[i][j];

                        String cadenaTemporal = (String) textField.getText();
                        double valorTemporal = Double.parseDouble(cadenaTemporal);
                        textField.setText(Calculos.df.format(1 / valorTemporal));


                    } else if (componentes[i][j].getName().equals("combo")) {

                        JComboBox comboBox = (JComboBox) componentes[i][j];
                        int index = comboBox.getSelectedIndex();

                        for (int k = 0; k < comboBox.getItemCount(); k++) {
                            String cadenaTemporal = (String) comboBox.getItemAt(0);
                            String[] divisionCadena = cadenaTemporal.split("-");
                            double valorTemporal = Double.parseDouble(divisionCadena[0].replaceAll(",", "."));

                            comboBox.removeItemAt(0);
                            cadenaTemporal = Calculos.df.format(1 / valorTemporal) + "-" + divisionCadena[1];
                            comboBox.addItem(cadenaTemporal);
                        }

                        comboBox.setSelectedIndex(index);
                    } else if (componentes[i][j].getName().equals("label")) {

                        JLabel label = (JLabel) componentes[i][j];
                        String cadenaTemporal = (String) label.getText();
                        double valorTemporal = Double.parseDouble(cadenaTemporal);
                        label.setText(Calculos.df.format(1 / valorTemporal).replaceAll(",", "."));
                    }

                }
            }
        }

        Matriz matrizTemporal = new Matriz();
        matrizTemporal.setMatriz(getMatriz());
        Calculos.setMatriz(matrizTemporal);
        Calculos.setMetodoParaCriteriosMiniziados(Calculos.MAXIMIZAR_INVERSA);
        habilitarPanelMetodosNormalizacion(true);
    }

    private boolean validarPosicionMatriz(int fila, int columna, String[][] matrizTemp) {
        boolean respuesta = true;
        if (fila >= matrizTemp.length) {
            respuesta = false;
        }
        if (columna >= matrizTemp[0].length) {
            respuesta = false;
        }
        return respuesta;
    }

    private String resumenResultadosFinales() {
        double[] resultadosFinales = Calculos.resultadosPonderacionesFinales;

        String resultado = "";
        double mayor = -1;
        int indiceMayor = -1;
        for (int i = 0; i < resultadosFinales.length; i++) {
            resultado += "La alternativa " + alternativas.get(i).getNombre() + " tiene " + Calculos.df.format(resultadosFinales[i]) + " en total\n";
            if (resultadosFinales[i] > mayor) {
                mayor = resultadosFinales[i];
                indiceMayor = i;
            }
        }
        resultado += "\n";
        resultado += "La mejor alternativa es " + alternativas.get(indiceMayor).getNombre();

        return resultado;
    }
}
